#include <utility>

using namespace std;

int main()
{
    int i = 42;             
    int &r = i;                 // 正确：r 引用 i
    // int &&rr = i;            // 错误：不能将一个右值引用绑定到一个左值上
    // int &r2 = i * 42;        // 错误：i*42 是一个右值
    const int &r3 = i * 42;     // 正确：我们可以将一个 const 的引用绑定到一个右值上
    int &&rr2 = i * 42;         // 正确：将 rr2 绑定到乘法结果上

    int &&rr3 = 42;             // 正确：字面常量是右值
    // int &&rr4 = rr3;         // 错误：表达式 rr3 是左值！

    // 变量都是左值，即使这个变量是右值引用类型

    int &&rr5 = std::move(rr3); // ok
}